{"componentChunkName":"component---node-modules-rocketseat-gatsby-theme-docs-core-src-templates-docs-query-js","path":"/manual-review/FractionFactory-FFY","result":{"data":{"mdx":{"id":"bcc7e08c-d941-5c7a-973b-ef97586a1e39","excerpt":"FFY-01M: Manual Configuration of Name & Symbol Type Severity Location Input Sanitization FractionFactory.sol:L152 ,  L153 Description: The  FractionFactory…","fields":{"slug":"/manual-review/FractionFactory-FFY/"},"frontmatter":{"title":"FractionFactory Manual Review Findings","description":"Contains all the findings that relate to manual review on the contract codebase","image":null,"disableTableOfContents":null},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"FractionFactory Manual Review Findings\",\n  \"description\": \"Contains all the findings that relate to manual review on the contract codebase\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h2\", {\n    \"id\": \"span-idffy-01mffy-01m-manual-configuration-of-name--symbolspan\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#span-idffy-01mffy-01m-manual-configuration-of-name--symbolspan\",\n    \"aria-label\": \"span idffy 01mffy 01m manual configuration of name  symbolspan permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), mdx(\"span\", {\n    id: \"FFY-01M\"\n  }, \"FFY-01M: Manual Configuration of Name & Symbol\")), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Type\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Severity\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Location\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"/reports/evergon-labs-onchain-data-containers-67586dec2e0f7500187d6bc9/appendix/finding-types#input-sanitization\"\n  }, \"Input Sanitization\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"img\", {\n    parentName: \"td\",\n    \"className\": \"o-severity o-minor\",\n    \"src\": \"https://omniscia.io/report-assets/minor.png\"\n  })), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/evergonlabs/ODC/blob/e712cb66013ac0ecf990a08d86e95fb7819e6afa/contracts/dataManagers/fractionalizers/FractionFactory.sol#L152\"\n  }, \"FractionFactory.sol:L152\"), \", \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/evergonlabs/ODC/blob/e712cb66013ac0ecf990a08d86e95fb7819e6afa/contracts/dataManagers/fractionalizers/FractionFactory.sol#L153\"\n  }, \"L153\"))))), mdx(\"h3\", {\n    \"id\": \"description\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#description\",\n    \"aria-label\": \"description permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Description:\"), mdx(\"p\", null, \"The \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/evergonlabs/ODC/blob/e712cb66013ac0ecf990a08d86e95fb7819e6afa/contracts/dataManagers/fractionalizers/FractionFactory.sol#L150-L185\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"FractionFactory::deploy\")), \" function accepts dynamic \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"name_\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"symbol_\"), \" arguments which may overlap with existingly deployed fraction instances.\"), mdx(\"h3\", {\n    \"id\": \"impact\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#impact\",\n    \"aria-label\": \"impact permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Impact:\"), mdx(\"p\", null, \"The \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"name_\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"symbol_\"), \" configurability of the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/evergonlabs/ODC/blob/e712cb66013ac0ecf990a08d86e95fb7819e6afa/contracts/dataManagers/fractionalizers/FractionFactory.sol#L150-L185\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"FractionFactory::deploy\")), \" function permits poisoning and similar social engineering attacks to be executed.\"), mdx(\"h3\", {\n    \"id\": \"example\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#example\",\n    \"aria-label\": \"example permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Example:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-sol\",\n    \"metastring\": \"title=contracts/dataManagers/fractionalizers/FractionFactory.sol highlight={4,5,15,16} lineNumbers=true lineOffset=148\",\n    \"title\": \"contracts/dataManagers/fractionalizers/FractionFactory.sol\",\n    \"highlight\": \"{4,5,15,16}\",\n    \"lineNumbers\": \"true\",\n    \"lineOffset\": \"148\"\n  }, \"/// @inheritdoc IFractionFactory\\nfunction deploy(\\n    uint32[] calldata chainIds,\\n    string memory name_,\\n    string memory symbol_,\\n    uint256 nftId_,\\n    uint256 amountToBeMinted_,\\n    address payable refundAddress\\n) external payable onlyOwner returns (address dm, bytes32 datapoint) {\\n    // Allocate DataPoiint\\n    DataPoint dp = IDataPointRegistry(_registry).allocate(address(this));\\n    datapoint = DataPoint.unwrap(dp);\\n\\n    // Deploy & approve local DM\\n    bytes32 salt = keccak256(abi.encodePacked(_msgSender(), nftId_));\\n    dm = computeDeployAddress(_msgSender(), nftId_);\\n\\n    IAccessManagerOmnichain(_dataIndex).approveDataManager(dp, dm, true);\\n    _deployOnLocalChain(datapoint, salt, name_, symbol_, nftId_, amountToBeMinted_, true);\\n\\n    // Prepare deployment data for secondary chains\\n    bytes memory message = _buildLzSendMessage(datapoint, salt, name_, symbol_, nftId_, amountToBeMinted_);\\n\\n    (uint256[] memory deployFees, uint256 totalNativeFee) = _estimateAndValidateFeesAndApproveDms(chainIds, dp, dm, message, refundAddress);\\n\\n    _deployOnOtherChains(chainIds, message, refundAddress, deployFees);\\n\\n    // Transfer DataPoint ownership to the caller\\n    IDataPointRegistry(_registry).transferOwnership(dp, msg.sender);\\n\\n    // Refund\\n    if (msg.value > totalNativeFee) {\\n        unchecked {\\n            refundAddress.sendValue(msg.value - totalNativeFee);\\n        }\\n    }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"recommendation\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#recommendation\",\n    \"aria-label\": \"recommendation permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Recommendation:\"), mdx(\"p\", null, \"We advise the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"name_\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"symbol_\"), \" arguments to be replaced by automatically generated ones based on the wrapper's own metadata that is being fractionalized, ensuring that they cannot be spoofed as being of a different NFT ID than they actually are.\"), mdx(\"h3\", {\n    \"id\": \"alleviation-c6b23c23d8bcd8cce85049ad959cbd711a37126b\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#alleviation-c6b23c23d8bcd8cce85049ad959cbd711a37126b\",\n    \"aria-label\": \"alleviation c6b23c23d8bcd8cce85049ad959cbd711a37126b permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Alleviation (c6b23c23d8bcd8cce85049ad959cbd711a37126b):\"), mdx(\"p\", null, \"A manual \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"name_\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"symbol_\"), \" can no longer be specified during the deployment of a \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/evergonlabs/ODC/blob/c6b23c23d8bcd8cce85049ad959cbd711a37126b/contracts/dataManagers/fractionalizers/FractionFactory.sol#L150-L185\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"FractionFactory::deploy\")), \" invocation, ensuring that poisoning and spoofing attacks cannot be executed via this avenue.\"), mdx(ViewDiffButton, {\n    repoUrl: \"https://github.com/evergonlabs/ODC\",\n    mainHash: \"e712cb66013ac0ecf990a08d86e95fb7819e6afa\",\n    fixHash: \"c6b23c23d8bcd8cce85049ad959cbd711a37126b\",\n    gitHubIssue: \"0\",\n    mdxType: \"ViewDiffButton\"\n  }), mdx(\"h2\", {\n    \"id\": \"span-idffy-02mffy-02m-improper-refund-addressesspan\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#span-idffy-02mffy-02m-improper-refund-addressesspan\",\n    \"aria-label\": \"span idffy 02mffy 02m improper refund addressesspan permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), mdx(\"span\", {\n    id: \"FFY-02M\"\n  }, \"FFY-02M: Improper Refund Addresses\")), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Type\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Severity\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Location\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"/reports/evergon-labs-onchain-data-containers-67586dec2e0f7500187d6bc9/appendix/finding-types#logical-fault\"\n  }, \"Logical Fault\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"img\", {\n    parentName: \"td\",\n    \"className\": \"o-severity o-medium\",\n    \"src\": \"https://omniscia.io/report-assets/medium.png\"\n  })), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/evergonlabs/ODC/blob/e712cb66013ac0ecf990a08d86e95fb7819e6afa/contracts/dataManagers/fractionalizers/FractionFactory.sol#L156\"\n  }, \"FractionFactory.sol:L156\"), \", \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/evergonlabs/ODC/blob/e712cb66013ac0ecf990a08d86e95fb7819e6afa/contracts/dataManagers/fractionalizers/FractionFactory.sol#L172\"\n  }, \"L172\"), \", \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/evergonlabs/ODC/blob/e712cb66013ac0ecf990a08d86e95fb7819e6afa/contracts/dataManagers/fractionalizers/FractionFactory.sol#L174\"\n  }, \"L174\"), \", \", mdx(\"a\", {\n    parentName: \"td\",\n    \"href\": \"https://github.com/evergonlabs/ODC/blob/e712cb66013ac0ecf990a08d86e95fb7819e6afa/contracts/dataManagers/fractionalizers/FractionFactory.sol#L182\"\n  }, \"L182\"))))), mdx(\"h3\", {\n    \"id\": \"description-1\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#description-1\",\n    \"aria-label\": \"description 1 permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Description:\"), mdx(\"p\", null, \"The \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/evergonlabs/ODC/blob/e712cb66013ac0ecf990a08d86e95fb7819e6afa/contracts/dataManagers/fractionalizers/FractionFactory.sol#L150-L185\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"a\"\n  }, \"FractionFactory::deploy\")), \" function will assume that the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"refundAddress\"), \" specified is equivalent across chains which is incorrect as many L2s employ address masking, especially in the context of smart contract refund recipients (i.e. multi-signature wallets).\"), mdx(\"h3\", {\n    \"id\": \"impact-1\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#impact-1\",\n    \"aria-label\": \"impact 1 permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Impact:\"), mdx(\"p\", null, \"A cross-chain message's surplus or failure may result in unspent native funds being erroneously sent to an incorrect / inaccessible refund recipient, resulting in minor fund loss.\"), mdx(\"h3\", {\n    \"id\": \"example-1\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#example-1\",\n    \"aria-label\": \"example 1 permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Example:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-sol\",\n    \"metastring\": \"title=contracts/dataManagers/fractionalizers/FractionFactory.sol highlight={24,26,34} lineNumbers=true lineOffset=148\",\n    \"title\": \"contracts/dataManagers/fractionalizers/FractionFactory.sol\",\n    \"highlight\": \"{24,26,34}\",\n    \"lineNumbers\": \"true\",\n    \"lineOffset\": \"148\"\n  }, \"/// @inheritdoc IFractionFactory\\nfunction deploy(\\n    uint32[] calldata chainIds,\\n    string memory name_,\\n    string memory symbol_,\\n    uint256 nftId_,\\n    uint256 amountToBeMinted_,\\n    address payable refundAddress\\n) external payable onlyOwner returns (address dm, bytes32 datapoint) {\\n    // Allocate DataPoiint\\n    DataPoint dp = IDataPointRegistry(_registry).allocate(address(this));\\n    datapoint = DataPoint.unwrap(dp);\\n\\n    // Deploy & approve local DM\\n    bytes32 salt = keccak256(abi.encodePacked(_msgSender(), nftId_));\\n    dm = computeDeployAddress(_msgSender(), nftId_);\\n\\n    IAccessManagerOmnichain(_dataIndex).approveDataManager(dp, dm, true);\\n    _deployOnLocalChain(datapoint, salt, name_, symbol_, nftId_, amountToBeMinted_, true);\\n\\n    // Prepare deployment data for secondary chains\\n    bytes memory message = _buildLzSendMessage(datapoint, salt, name_, symbol_, nftId_, amountToBeMinted_);\\n\\n    (uint256[] memory deployFees, uint256 totalNativeFee) = _estimateAndValidateFeesAndApproveDms(chainIds, dp, dm, message, refundAddress);\\n\\n    _deployOnOtherChains(chainIds, message, refundAddress, deployFees);\\n\\n    // Transfer DataPoint ownership to the caller\\n    IDataPointRegistry(_registry).transferOwnership(dp, msg.sender);\\n\\n    // Refund\\n    if (msg.value > totalNativeFee) {\\n        unchecked {\\n            refundAddress.sendValue(msg.value - totalNativeFee);\\n        }\\n    }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"recommendation-1\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#recommendation-1\",\n    \"aria-label\": \"recommendation 1 permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Recommendation:\"), mdx(\"p\", null, \"We advise the system to permit a different refund address to be specified per chain and to utilize the caller address as the intended refund recipient for any locally-unspent funds, ensuring that message refund operations are executed correctly.\"), mdx(\"h3\", {\n    \"id\": \"alleviation-c6b23c23d8bcd8cce85049ad959cbd711a37126b-1\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#alleviation-c6b23c23d8bcd8cce85049ad959cbd711a37126b-1\",\n    \"aria-label\": \"alleviation c6b23c23d8bcd8cce85049ad959cbd711a37126b 1 permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Alleviation (c6b23c23d8bcd8cce85049ad959cbd711a37126b):\"), mdx(\"p\", null, \"After discussions with the Evergon Labs team, we concluded that this particular \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"refundAddress\"), \" does not require to be updated as it is meant to represent a local refund address rather than a refund address at an L2 level.\"), mdx(\"p\", null, \"As such, we consider this exhibit to be nullified.\"));\n}\n;\nMDXContent.isMDXComponent = true;","headings":[{"depth":2,"value":"<span id=\"FFY-01M\">FFY-01M: Manual Configuration of Name & Symbol</span>"},{"depth":3,"value":"Description:"},{"depth":3,"value":"Impact:"},{"depth":3,"value":"Example:"},{"depth":3,"value":"Recommendation:"},{"depth":3,"value":"Alleviation (c6b23c23d8bcd8cce85049ad959cbd711a37126b):"},{"depth":2,"value":"<span id=\"FFY-02M\">FFY-02M: Improper Refund Addresses</span>"},{"depth":3,"value":"Description:"},{"depth":3,"value":"Impact:"},{"depth":3,"value":"Example:"},{"depth":3,"value":"Recommendation:"},{"depth":3,"value":"Alleviation (c6b23c23d8bcd8cce85049ad959cbd711a37126b):"}]}},"pageContext":{"slug":"/manual-review/FractionFactory-FFY/","prev":{"label":"FractionERC20DataManager.sol (FED-M)","link":"/manual-review/FractionERC20DataManager-FED"},"next":{"label":"FungibleFractionsDO.sol (FFD-M)","link":"/manual-review/FungibleFractionsDO-FFD"}}},"staticQueryHashes":["1954253342","2328931024","2501019404","973074209"]}